//任务：已经完成了一个FIFO 我现在需要多个FIFO  怎么做比较好？
//回答：一定要去耦合 所以需要更加抽象 我需要把数据结构和函数封装到一起 做一个整体double！
//之前写的测量程序时间的计算模块也是这样 需要数据+函数封装在一起！线程独立！

#include "../GKoSonTools/FIFO/ringBuff.h"  //#技术#//


//0---失败 1--成功
static u8 Write_RingBuff(void *FIFO,u8 data)
{
	FIFO_Type *pFIFO=(FIFO_Type *)FIFO;
	if(pFIFO->ringBuff.Lenght >= RINGBUFF_LEN)return 0;
	pFIFO->ringBuff.Ring_Buff[pFIFO->ringBuff.Tail]=data;
	pFIFO->ringBuff.Tail = (pFIFO->ringBuff.Tail+1)%RINGBUFF_LEN;//防止越界非法访问
	pFIFO->ringBuff.Lenght++;
	return 1; 
}

//0--失败 1--成功
static u8 Read_RingBuff_one(void *FIFO ,u8 *data)
{
	FIFO_Type *pFIFO=(FIFO_Type *)FIFO;
	if(pFIFO->ringBuff.Lenght == 0)return 0;
	*data = pFIFO->ringBuff.Ring_Buff[pFIFO->ringBuff.Head];//先进先出FIFO，从缓冲区头出
	pFIFO->ringBuff.Head = (pFIFO->ringBuff.Head+1)%RINGBUFF_LEN;//防止越界非法访问
	pFIFO->ringBuff.Lenght--;
	return 1; 
}

//0--失败 1--成功 参数是过来数组&长度 不需要自带内存 我们二级指针会底层提供
//潜在问题：二级指针不稳定 读走以后必须马上处理 否则下次收新数据过来了
static u8 Read_RingBuff_all(void *FIFO,u8 **rData,u16 *len)
{
	FIFO_Type *pFIFO=(FIFO_Type *)FIFO;//为了避免警告 我们自己强行转化
	if(pFIFO->ringBuff.Lenght == 0) return 0;
	*rData = &pFIFO->ringBuff.Ring_Buff[pFIFO->ringBuff.Head];
	*len = pFIFO->ringBuff.Lenght;
	//相当于RingBuff_Init
	pFIFO->ringBuff.Head = 0;
	pFIFO->ringBuff.Tail = 0;
	pFIFO->ringBuff.Lenght = 0;
	return 1; 
}



static u8 FIFO_GetLen(void *FIFO)
{
	FIFO_Type *pFIFO=(FIFO_Type *)FIFO;
	return pFIFO->ringBuff.Lenght;
}

void FIFO_Init(void *FIFO)
{
	FIFO_Type *pFIFO=(FIFO_Type *)FIFO;
	pFIFO->ringBuff.Head = 0;
	pFIFO->ringBuff.Tail = 0;
	pFIFO->ringBuff.Lenght = 0;
	pFIFO->write=Write_RingBuff;
	pFIFO->readone=Read_RingBuff_one;
	pFIFO->readall=Read_RingBuff_all;
	pFIFO->getlen=FIFO_GetLen;
	//pFIFO->Init=FIFO_Init; //#技术#//
}


void FIFO_Type_Init(FIFO_Type *pFIFO)
{
	pFIFO->ringBuff.Head = 0;
	pFIFO->ringBuff.Tail = 0;
	pFIFO->ringBuff.Lenght = 0;
	pFIFO->write=Write_RingBuff;
	pFIFO->readone=Read_RingBuff_one;
	pFIFO->readall=Read_RingBuff_all;
	pFIFO->getlen=FIFO_GetLen;
}

//FIFO_Type FIFO1 __attribute__ ((at(0X20000100)));
